npm scriptsから実行してCognitoユーザーのIDトークンを取得できるスクリプト(TypeScript)を作ってみた
こんにちは、CX事業本部 IoT事業部の若槻です。
以前のエントリで、Amazon Cognitoユーザープール上のユーザーのトークン情報をadmin-initiate-auth
で取得する方法を確認しました。
今回は、このトークン取得をnpmプロジェクト内でもっと簡単に行えるように、npm scripts
から実行してCognitoユーザーのIDトークンを取得できるスクリプト(TypeScript)を作ってみました。
作ってみた
前提
Cognitoユーザープールの環境はすでに作成済みで、以前のエントリの内容であれば実施可能である前提とします。
準備
必要なパッケージをインストールします。
$ npm i aws-sdk $ npm i -D typescript ts-node dotenv dotenv-cli
.env
ファイルにCognitoユーザープールIDとクライアントIDを記述します。
USER_POOL_ID="ap-northeast-1_XXXXXXXXX" COGNITO_CLIENT_ID="xxxxxxxxxxxxxxxxxxxxxxx"
package.json
に次のようにscriptsを記述します。dotenv
で.env
の環境変数を使用可能としています。またts-node
でtsスクリプトを実行できるようにしています。
{ "scripts": { "get-user-id-token": "dotenv -e .env -- ./node_modules/.bin/ts-node ./cognito-user-id-token-helper.ts } }
スクリプト
adminInitiateAuth
APIを使用してトークン情報を取得し、IDトークンを標準出力するようにしています。
import * as CognitoIdp from 'aws-sdk/clients/cognitoidentityserviceprovider'; const COGNITO_API_VERSION = '2016-04-18'; const REGION = 'ap-northeast-1'; const COGNITO_USER_POOL_ID = process.env.USER_POOL_ID!; const COGNITO_CLIENT_ID = process.env.COGNITO_CLIENT_ID!; const MY_USERNAME = process.env.MY_USERNAME!; const MY_MY_PASSWORD!; export const cognitoIdpClient = new CognitoIdp({ apiVersion: COGNITO_API_VERSION, region: REGION, }); /** * IDトークンを取得 */ const getIdToken = async (): Promise<void> => { const params: CognitoIdp.AdminInitiateAuthRequest = { UserPoolId: COGNITO_USER_POOL_ID, ClientId: COGNITO_CLIENT_ID, AuthFlow: 'ADMIN_USER_PASSWORD_AUTH', AuthParameters: { USERNAME: MY_USERNAME, PASSWORD: MY_PASSWORD, }, }; const response = await cognitoIdpClient.adminInitiateAuth(params).promise(); const idToken = response.AuthenticationResult?.IdToken!; console.log(`ID_TOKEN="${idToken}"`); }; getIdToken();
動作
Cognitoユーザーのユーザー名とパスワードを環境変数で指定します。
$ export MY_USERNAME=XXXXXXXXX $ export MY_PASSWORD=YYYYYYYYYYYY
スクリプトを実行します。するとコンソールにID_TOKEN="<IDトークン>"
と表示され、IDトークンを取得できました!
$ npm run get-user-id-token ID_TOKEN="eyJraWQiOiJpWUVSNVxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx..."
あとはこれをexport
したり、.env
ファイルに追記するなりすれば、他の処理(Cognito認証を伴うE2Eテストなど)でも利用できるようになります!
おわりに
npm scriptsから実行してCognitoユーザーのIDトークンを取得できるスクリプト(TypeScript)を作ってみました。
Cognitoオーソライザーを設定したAPI Gateway Rest APIのE2Eテストを実施するたびにIDトークンを取得し直すのが手間だったので、これで簡略化できそうです!
以上